
package ch.hearc.coursJava.moo.heritage.animals;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Laurent Novac
 */
public class Zoo implements Iterable<Animals>
	{

	/*------------------------------------------------------------------*\
	|*							Constructeurs							*|
	\*------------------------------------------------------------------*/

	public Zoo(List<Animals> listAnimalSource)
		{
		this.listAnimal = listAnimalSource;
		}

	public Zoo()
		{
		this(new ArrayList<Animals>());
		}

	public Zoo(Zoo source)
		{
		this();
		for(Animals animal:source.listAnimal)
			{
			this.listAnimal.add(animal.cloneOf());
			}
		}

	/*------------------------------*\
	|*				Get				*|
	\*------------------------------*/

	public List<Animals> getListAnimal()
		{
		return this.listAnimal;
		}

	/*------------------------------------------------------------------*\
	|*							Methodes Public							*|
	\*------------------------------------------------------------------*/

	public void add(Animals animal)
		{
		listAnimal.add(animal);
		}

	public void remove(Animals animal)
		{
		listAnimal.remove(animal);
		}

	@Override
	public Iterator<Animals> iterator()
		{
		return listAnimal.listIterator();
		}

	@Override
	public String toString()
		{
		StringBuilder builder = new StringBuilder();
		builder.append("Zoo [listAnimal=");
		builder.append(this.listAnimal);
		builder.append("]");
		return builder.toString();
		}

	public void manger()
		{
		for(Animals animal:this)
			{
			animal.mange();
			}
		}

	/**
	 * Affiche les animaux trier selon leur nom:
	 * Contrainte: ne pas changer l'ordre d'insertion des animaux.
	 */
	public void afficher()
		{
		Comparator<Animals> comparator=new Comparator<Animals>()
			{

				@Override
				public int compare(Animals animal1, Animals animal2)
					{
					String nom1=animal1.getNom();
					String nom2 = animal2.getNom();

					return nom1.compareTo(nom2);
					}

			};

		//copie profonde de la structure mais copie superficielle du contenu car sort est un tri sur place.
		List<Animals> listTrier=new ArrayList<Animals>(listAnimal.size());//copie profonde
		for(Animals animal:this)
			{
			listTrier.add(animal);//copie superficielle, pour des raisons de performance
			}

		Collections.sort(listTrier, comparator);//tri sur place, modifie la listTrier
		System.out.println(listTrier);
		}
	/*------------------------------------------------------------------*\
	|*							Attributs Private						*|
	\*------------------------------------------------------------------*/

	//tools
	private List<Animals> listAnimal;

	}
